Feedback

  1. Not a good idea to create a single “full” dataset. This is the STATA way of working. Instead follow a more deliberate approach of only bringing in variables that you are interested into a particular dataset.
  2. Use the head() command to only print a few of the rows instead of all of them.
  3. Use a tabbed layout # {.tabset .tabset-fade .tabset-pills}
  4. Only keep chunks of code that are necessary for the analysis
  5. Avoid using pipes for single function calls df %>% str() for instance.
  6. Remove redundant axis titles from charts
  7. Look forcats package to reorder factors and generate labels for values
  8. Use fig.width and fig.height chunk options to set plot sizes
  9. Describe the insight from each chart
  10. broom
  11. write_csv()

Checking

group nest

Question

CHEATSHEETS

  1. Data visualization
  2. Data Manipulation

Create a new notebook (copy parts of the YAML header you are interested in keeping) to work on your assignment. The assignment should be submitted via a shareable github link that points to your notebook (.nb.html) file to me on Slack. Make sure the notebook is neatly formatted, and that all the charts and tables and look good when you preview it. Task: Explore at least 5 different causes for departure and arrival delays (combined - not 5 each). Its not necessary that you find a definitive answer for what causes a delay, instead I want you to showcase your ability to explore the data with a combination of analytical text, tables and charts. The final output should be something you can show a prospective employer or client as proof of you ability to work with data in R.

Explore

Skim summary statistics
 n obs: 336776 
 n variables: 19 

── Variable type:character ────────────────────────────────────────────────────────────────────────────────────────────────────────────
 variable missing complete      n min max empty n_unique
  carrier       0   336776 336776   2   2     0       16
     dest       0   336776 336776   3   3     0      105
   origin       0   336776 336776   3   3     0        3
  tailnum    2512   334264 336776   5   6     0     4043

── Variable type:integer ──────────────────────────────────────────────────────────────────────────────────────────────────────────────
       variable missing complete      n    mean      sd   p0  p25  p50  p75 p100     hist
       arr_time    8713   328063 336776 1502.05  533.26    1 1104 1535 1940 2400 ▁▁▃▇▆▆▇▆
            day       0   336776 336776   15.71    8.77    1    8   16   23   31 ▇▇▇▇▆▇▇▇
       dep_time    8255   328521 336776 1349.11  488.28    1  907 1401 1744 2400 ▁▁▇▆▆▇▆▂
         flight       0   336776 336776 1971.92 1632.47    1  553 1496 3465 8500 ▇▅▂▃▂▁▁▁
          month       0   336776 336776    6.55    3.41    1    4    7   10   12 ▇▅▇▃▅▇▅▇
 sched_arr_time       0   336776 336776 1536.38  497.46    1 1124 1556 1945 2359 ▁▁▂▇▆▇▇▆
 sched_dep_time       0   336776 336776 1344.25  467.34  106  906 1359 1729 2359 ▁▃▇▆▆▇▇▂
           year       0   336776 336776 2013       0    2013 2013 2013 2013 2013 ▁▁▁▇▁▁▁▁

── Variable type:numeric ──────────────────────────────────────────────────────────────────────────────────────────────────────────────
  variable missing complete      n    mean     sd  p0 p25 p50  p75 p100     hist
  air_time    9430   327346 336776  150.69  93.69  20  82 129  192  695 ▇▇▂▃▁▁▁▁
 arr_delay    9430   327346 336776    6.9   44.63 -86 -17  -5   14 1272 ▇▁▁▁▁▁▁▁
 dep_delay    8255   328521 336776   12.64  40.21 -43  -5  -2   11 1301 ▇▁▁▁▁▁▁▁
  distance       0   336776 336776 1039.91 733.23  17 502 872 1389 4983 ▆▇▂▂▁▁▁▁
      hour       0   336776 336776   13.18   4.66   1   9  13   17   23 ▁▃▇▆▅▇▇▂
    minute       0   336776 336776   26.23  19.3    0   8  29   44   59 ▇▂▃▃▅▂▃▅

── Variable type:POSIXct ──────────────────────────────────────────────────────────────────────────────────────────────────────────────
  variable missing complete      n        min        max     median n_unique
 time_hour       0   336776 336776 2013-01-01 2013-12-31 2013-07-03     6936

Create the data

*Ignoring airports for the purpose of this assignment. Starting with a full merged dataset (and narrow down later by hypothesis).

We start first by exploring keys for different datasets

Merging weather and airlines and planes to flights with established keys

Analysis

  • Question 1: Is there a relationship between the carrier you fly and delays. That is, do certain airlines have a track record of departure delays?

Examining data sources and independent var

 [1] "year.x"         "month.x"        "day.x"          "dep_time"       "sched_dep_time" "dep_delay"      "arr_time"      
 [8] "sched_arr_time" "arr_delay"      "carrier"        "flight"         "tailnum"        "origin"         "dest"          
[15] "air_time"       "distance"       "hour.x"         "minute"         "time_hour"      "year.y"         "month.y"       
[22] "day.y"          "hour.y"         "temp"           "dewp"           "humid"          "wind_dir"       "wind_speed"    
[29] "wind_gust"      "precip"         "pressure"       "visib"          "name"           "year"           "type"          
[36] "manufacturer"   "model"          "engines"        "seats"          "speed"          "engine"        

Examining how many observations (flights) per airline

Exploring how visibility along with precipitation relates to delay. Question for Hari - how do I add label to visib? Also, how do I get both visib groups into the same chart with different colors and lines.

+Question 4: Does the volume of flights on any given day affect delays? Hari - this was a very roundabout way of doing this. Would appreciate thoughts on a simpler solution.

simpler way

*Question 5:

LS0tCnRpdGxlOiAiQXNzaWdubWVudCAyIgphdXRob3I6ICJaZWVuYXQgTmF6aXIiCmRhdGU6ICJEYXRlIGNyZWF0ZWQ6IGByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogCiAgICBkZl9wcmludDogcGFnZWQKICAgIGhpZ2hsaWdodDogaGFkZG9jawogICAgdGhlbWU6IHJlYWRhYmxlCi0tLQoKIyB7LnRhYnNldCAudGFic2V0LWZhZGV9CgojIyBGZWVkYmFjawoxLiBOb3QgYSBnb29kIGlkZWEgdG8gY3JlYXRlIGEgc2luZ2xlICJmdWxsIiBkYXRhc2V0LiBUaGlzIGlzIHRoZSBTVEFUQSB3YXkgb2Ygd29ya2luZy4gSW5zdGVhZCBmb2xsb3cgYSBtb3JlIGRlbGliZXJhdGUgYXBwcm9hY2ggb2Ygb25seSBicmluZ2luZyBpbiB2YXJpYWJsZXMgdGhhdCB5b3UgYXJlIGludGVyZXN0ZWQgaW50byBhIHBhcnRpY3VsYXIgZGF0YXNldC4KMi4gVXNlIHRoZSBgaGVhZCgpYCBjb21tYW5kIHRvIG9ubHkgcHJpbnQgYSBmZXcgb2YgdGhlIHJvd3MgaW5zdGVhZCBvZiBhbGwgb2YgdGhlbS4KMy4gVXNlIGEgdGFiYmVkIGxheW91dCBgIyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc31gCjQuIE9ubHkga2VlcCBjaHVua3Mgb2YgY29kZSB0aGF0IGFyZSBuZWNlc3NhcnkgZm9yIHRoZSBhbmFseXNpcwo1LiBBdm9pZCB1c2luZyBwaXBlcyBmb3Igc2luZ2xlIGZ1bmN0aW9uIGNhbGxzIGBkZiAlPiUgc3RyKClgIGZvciBpbnN0YW5jZS4KNi4gUmVtb3ZlIHJlZHVuZGFudCBheGlzIHRpdGxlcyBmcm9tIGNoYXJ0cwo3LiBMb29rIGBmb3JjYXRzYCBwYWNrYWdlIHRvIHJlb3JkZXIgZmFjdG9ycyBhbmQgZ2VuZXJhdGUgbGFiZWxzIGZvciB2YWx1ZXMKOC4gVXNlIGBmaWcud2lkdGhgIGFuZCBgZmlnLmhlaWdodGAgY2h1bmsgb3B0aW9ucyB0byBzZXQgcGxvdCBzaXplcwo5LiBEZXNjcmliZSB0aGUgaW5zaWdodCBmcm9tIGVhY2ggY2hhcnQKMTAuIGBicm9vbWAKMTEuIGB3cml0ZV9jc3YoKWAKCiMjIyBDaGVja2luZwoKIyMgZ3JvdXAgbmVzdAoKYGBge3J9CiMgZ3JvdXBlZF9mbGlnaHRzIDwtIGZsaWdodHMgJT4lIAojICAgICBncm91cF9uZXN0KGNhcnJpZXIpICU+JSAKIyAgICAgbWFwKGRhdGEsIG1vZGVsX2Z1bmMpICU+JSAKIyAgICAgbWFwKGRhdGEsIGV4dHJhY3RfbW9kZWxfY2hhcikKCiMgZ3JvdXBlZF9mbGlnaHRzCmBgYAoKCiMjIFF1ZXN0aW9uCgoqKkNIRUFUU0hFRVRTKioKCjEuIFtEYXRhIHZpc3VhbGl6YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2NoZWF0c2hlZXRzL2Jsb2IvbWFzdGVyL2RhdGEtdmlzdWFsaXphdGlvbi0yLjEucGRmKQoyLiBbRGF0YSBNYW5pcHVsYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL2NoZWF0c2hlZXRzL2Jsb2IvbWFzdGVyL2RhdGEtdHJhbnNmb3JtYXRpb24ucGRmKQoKCkNyZWF0ZSBhIG5ldyBub3RlYm9vayAoY29weSBwYXJ0cyBvZiB0aGUgWUFNTCBoZWFkZXIgeW91IGFyZSBpbnRlcmVzdGVkIGluIGtlZXBpbmcpIHRvIHdvcmsgb24geW91ciBhc3NpZ25tZW50LgpUaGUgYXNzaWdubWVudCBzaG91bGQgYmUgc3VibWl0dGVkIHZpYSBhIHNoYXJlYWJsZSBnaXRodWIgbGluayB0aGF0IHBvaW50cyB0byB5b3VyIG5vdGVib29rICgubmIuaHRtbCkgZmlsZSB0byBtZSBvbiBTbGFjay4KTWFrZSBzdXJlIHRoZSBub3RlYm9vayBpcyBuZWF0bHkgZm9ybWF0dGVkLCBhbmQgdGhhdCBhbGwgdGhlIGNoYXJ0cyBhbmQgdGFibGVzIGFuZCBsb29rIGdvb2Qgd2hlbiB5b3UgcHJldmlldyBpdC4KVGFzazogRXhwbG9yZSBhdCBsZWFzdCA1IGRpZmZlcmVudCBjYXVzZXMgZm9yIGRlcGFydHVyZSBhbmQgYXJyaXZhbCBkZWxheXMgKGNvbWJpbmVkIC0gbm90IDUgZWFjaCkuIEl0cyBub3QgbmVjZXNzYXJ5IHRoYXQgeW91IGZpbmQgYSBkZWZpbml0aXZlIGFuc3dlciBmb3Igd2hhdCBjYXVzZXMgYSBkZWxheSwgaW5zdGVhZCBJIHdhbnQgeW91IHRvIHNob3djYXNlIHlvdXIgYWJpbGl0eSB0byBleHBsb3JlIHRoZSBkYXRhIHdpdGggYSBjb21iaW5hdGlvbiBvZiBhbmFseXRpY2FsIHRleHQsIHRhYmxlcyBhbmQgY2hhcnRzLiBUaGUgZmluYWwgb3V0cHV0IHNob3VsZCBiZSBzb21ldGhpbmcgeW91IGNhbiBzaG93IGEgcHJvc3BlY3RpdmUgZW1wbG95ZXIgb3IgY2xpZW50IGFzIHByb29mIG9mIHlvdSBhYmlsaXR5IHRvIHdvcmsgd2l0aCBkYXRhIGluIFIuCgojIyBFeHBsb3JlCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkobnljZmxpZ2h0czEzKTsgbGlicmFyeShza2ltcik7IGxpYnJhcnkodGltZURhdGUpOyBsaWJyYXJ5KGdndGhlbWVzKSAKI2luc3RhbGwucGFja2FnZXMoInRpbWVEYXRlIikKI2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpCmxpYnJhcnkobHVicmlkYXRlKQpgYGAKCgpgYGB7cn0Kc2tpbShmbGlnaHRzKQpgYGAKCmBgYHtyfQp3ZWF0aGVyIAogICNza2ltKHdlYXRoZXIpCmBgYApgYGB7cn0KYWlycG9ydHMKI3NraW0oYWlycG9ydHMpCmBgYAoKYGBge3J9CmFpcmxpbmVzCmBgYAoKYGBge3J9CnBsYW5lcwpgYGAKCiMjIENyZWF0ZSB0aGUgZGF0YSAKIyMjIyAqSWdub3JpbmcgYWlycG9ydHMgZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgYXNzaWdubWVudC4gU3RhcnRpbmcgd2l0aCBhIGZ1bGwgbWVyZ2VkIGRhdGFzZXQgKGFuZCBuYXJyb3cgZG93biBsYXRlciBieSBoeXBvdGhlc2lzKS4KCiMjIyBXZSBzdGFydCBmaXJzdCBieSBleHBsb3Jpbmcga2V5cyBmb3IgZGlmZmVyZW50IGRhdGFzZXRzCmBgYHtyfQojVGhpcyBpcyBleHBsb3Jpbmcga2V5cyB0byBtZXJnZSB3ZWF0aGVyIHRvIGZsaWdodHMgYW5kIHRoZSBvdGhlciByZWxldmFudCBkYXRhc2V0cwp3ZWF0aGVyICU+JSAKICBncm91cF9ieSh0aW1lX2hvdXIsIG9yaWdpbikgJT4lIAogICNzdW1tYXJpc2Uobm9icyA9IG4oKSkgI1RoaXMgaXMganVzdCB0byBleHBsb3JlIGhvdyBtYW55IG9icyAoY291bnQpIHBlciBncm91cAogIGZpbHRlcihuKCkgPiAxKQpgYGAKYGBge3J9CiNUaGlzIGlzIGV4cGxvcmluZyBrZXlzIHRvIG1lcmdlIHBsYW5lcyB0byBmbGlnaHRzIGFuZCB0aGUgb3RoZXIgcmVsZXZhbnQgZGF0YXNldHMKcGxhbmVzICU+JSAKICBncm91cF9ieSh0YWlsbnVtKSAlPiUgCiAgI3N1bW1hcmlzZShub2JzID0gbigpKSAjVGhpcyBpcyBqdXN0IHRvIGV4cGxvcmUgaG93IG1hbnkgb2JzIChjb3VudCkgcGVyIGdyb3VwCiAgZmlsdGVyKG4oKSA+IDEpCmBgYAoKIyMjIE1lcmdpbmcgd2VhdGhlciBhbmQgYWlybGluZXMgYW5kIHBsYW5lcyB0byBmbGlnaHRzIHdpdGggZXN0YWJsaXNoZWQga2V5cwpgYGB7cn0Kd2VhdGhlcmVkRmxpZ2h0cyA8LSBmbGlnaHRzICU+JSAKICBsZWZ0X2pvaW4od2VhdGhlciwgYnkgPSBjKCJvcmlnaW4iLCAidGltZV9ob3VyIikpICU+JSAKICBsZWZ0X2pvaW4oYWlybGluZXMsIGJ5ID0gYygiY2FycmllciIpKSAlPiUgCiAgbGVmdF9qb2luKHBsYW5lcywgYnkgPSBjKCJ0YWlsbnVtIikpCiAgd2VhdGhlcmVkRmxpZ2h0cwpgYGAKCiMjIEFuYWx5c2lzCisgKipRdWVzdGlvbiAxOiBJcyB0aGVyZSBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBjYXJyaWVyIHlvdSBmbHkgYW5kIGRlbGF5cy4gVGhhdCBpcywgZG8gY2VydGFpbiBhaXJsaW5lcyBoYXZlIGEgdHJhY2sgcmVjb3JkIG9mIGRlcGFydHVyZSBkZWxheXM/KioKCiMjIyBFeGFtaW5pbmcgZGF0YSBzb3VyY2VzIGFuZCBpbmRlcGVuZGVudCB2YXIKYGBge3J9CndlYXRoZXJlZEZsaWdodHMgJT4lIApuYW1lcygpCmBgYAoKIyMjIEV4YW1pbmluZyBob3cgbWFueSBvYnNlcnZhdGlvbnMgKGZsaWdodHMpIHBlciBhaXJsaW5lCmBgYHtyfQp3ZWF0aGVyZWRGbGlnaHRzICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KG5hbWUpICU+JSAKICBjb3VudChuYW1lKSAlPiUgCiAgYXJyYW5nZShuKQpgYGAKCiMjIyBFeGFtaW5pbmcgYXZnIGRlcGFydHVyZSBkZWxheSBieSBjYXJyaWVyCmBgYHtyIGZpZy53aWR0aD05fQp3ZWF0aGVyZWRGbGlnaHRzICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KG5hbWUpICU+JSAKICBzdW1tYXJpc2UobWVhbkRlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVCkpICU+JSAKICBhcnJhbmdlKGRlc2MobWVhbkRlbGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobmFtZSwgbWVhbkRlbGF5KSwgeSA9IG1lYW5EZWxheSkpICsKICBnZW9tX2NvbCgpICsKICBjb29yZF9mbGlwKCkgKwogICAgbGFicygKICAgIHggPSAiQWlybGluZSIsCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChpbiBtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJSZWdpb25hbCBhaXJsaW5lcyB0ZW5kIHRvIGhhdmUgaGlnaGVyIGRlcGFydHVyZSBkZWxheXMiLAogICAgc3VidGl0bGUgPSAiQW1vbmcgdGhlIGxhcmdlciBkb21lc3RpYyBhaXJsaW5lcywgVW5pdGVkJ3MgYXZnIGRlbGF5ZWQgZGVwYXJ0dXJlcyBhcmUgbG93ZXN0IgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCgoKCisgKipRdWVzdGlvbiAyOiBXaGljaCBkYXlzIChpZiBhbnkpIG9mIHRoZSB3ZWVrIGhhdmUgaGlnaGVyIGRlcGFydHVyZSBkZWxheXMgYW5kIGlmIHNvLCB3aGljaCBhaXJwb3J0cyBoYXZlIHJlbGF0aXZlbHkgaGlnaCBkZXAgZGVsYXlzPyoqCgojIyMgSWRlbnRpZnlpbmcgYW5kIHVzaW5nIHRoZSByaWdodCB2YXJpYWJsZSB0byBleHRyYWN0IGRheSBvZiB0aGUgd2Vlay4gQW5kIHRoZW4gc3VtbWFyaXNpbmcgZGVwIGRlbGF5cyBieSBkYXkgb2YgdGhlIHdlZWsuIFF1ZXN0aW9uIGZvciBIYXJpIC0gaG93IGRvIEkgcmV2ZXJzZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgbGVnZW5kIHN1Y2ggdGhhdCBMR0EgaXMgdG9wIGFuZCBFV1IgYm90dG9tIHRvIG1vcmUgY2xlYW5seSBhbGlnbiB3aXRoIHRoZSBiYXJzPwpgYGB7cn0Kd2VhdGhlcmVkRmxpZ2h0cyAlPiUgCm11dGF0ZShkYXRlID0gYXMuRGF0ZSh0aW1lX2hvdXIpKSAlPiUgCm11dGF0ZShkYXlvZndlZWsgPSB3ZGF5KGRhdGUsIGxhYmVsID0gVFJVRSkpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KGRheW9md2Vlaywgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5EZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFQpKSAlPiUgCiAgYXJyYW5nZShkZXNjKG1lYW5EZWxheSkpICU+JSAKICBnZ3Bsb3QoYWVzKGRheW9md2VlaywgbWVhbkRlbGF5LCBmaWxsID0gb3JpZ2luKSkgKwogICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JywgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgKwogICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChtZWFuRGVsYXkpKSwgdmp1c3Q9MC40LCBjb2xvcj0iYmxhY2siLCBoanVzdCA9IC0wLjA1LCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSwgc2l6ZT0zLjIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSAiUGFpcmVkIikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIGxhYnMoCiAgICB4ID0gIkRheSIsCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChpbiBtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJTa2lwIHRoZSBxdWV1ZXMsIGZseSBvbiB3ZWVrZW5kcyEiCiAgICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKKyAqKlF1ZXN0aW9uIDM6IERvZXMgdmlzaWJpbGl0eSAoYWxvbmcgd2l0aCBwcmVjaXBpdGF0aW9uKSBhZmZlY3QgZGVwIGRlbGF5cz8qKgoKIyMjIEV4cGxvcmluZyB0aGUgdmlzaWJpbGl0eSB2YXIKYGBge3J9CndlYXRoZXIgJT4lIAogIGdncGxvdChhZXModmlzaWIpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKQpgYGAKIyMjIEV4cGxvcmluZyB0aGUgcHJlY2lwIHZhcgpgYGB7cn0Kd2VhdGhlciAlPiUgCiAgZ2dwbG90KGFlcyhwcmVjaXApKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjA1KQpgYGAKCgojIyMgRXhwbG9yaW5nIGhvdyB2aXNpYmlsaXR5IGFsb25lIHJlbGF0ZXMgdG8gZGVsYXkKYGBge3J9CiNFeHBsb3JlIGhvdyB2aXNpYmlsaXR5IHJlbGF0ZXMgdG8gZGVsYXkKd2VhdGhlcmVkRmxpZ2h0cyAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiAhaXMubmEoZGVwX2RlbGF5KSAmICFpcy5uYSh2aXNpYikpICU+JSAKICBncm91cF9ieSh2aXNpYikgJT4lIAogIHN1bW1hcmlzZShtZWFuRGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUKSkgJT4lIAogIGdncGxvdChhZXModmlzaWIsIG1lYW5EZWxheSkpKwogIGdlb21fcG9pbnQoKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgI3BhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BKSArCiAgICBsYWJzKAogICAgeCA9ICJWaXNpYmlsaXR5IChGZWV0KSIsCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJMb3dlciB2aXNpYmlsaXR5IHRyYW5zbGF0ZXMgdG8gaGlnaGVyIGRlcGFydHVyZSBkZWxheXMiCiAgICApICsKICB0aGVtZV9lY29ub21pc3QoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKYGBgCgojIyMgRXhwbG9yaW5nIGhvdyB2aXNpYmlsaXR5IGFsb25nIHdpdGggcHJlY2lwaXRhdGlvbiByZWxhdGVzIHRvIGRlbGF5LiBRdWVzdGlvbiBmb3IgSGFyaSAtIGhvdyBkbyBJIGFkZCBsYWJlbCB0byB2aXNpYj8gQWxzbywgaG93IGRvIEkgZ2V0IGJvdGggdmlzaWIgZ3JvdXBzIGludG8gdGhlIHNhbWUgY2hhcnQgd2l0aCBkaWZmZXJlbnQgY29sb3JzIGFuZCBsaW5lcy4KYGBge3J9CiNMZXQncyBleHBsb3JlIGhvdyBwcmVjaXAgYW5kIHZpc2liaWxpdHkgcmVsYXRlIHRvIGRlbGF5CndlYXRoZXJlZEZsaWdodHMgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgIWlzLm5hKGRlcF9kZWxheSkgJiAhaXMubmEodGVtcCkgJiAhaXMubmEodmlzaWIpKSAlPiUgCiAgbXV0YXRlKHZpc2liR3JvdXAgPSBjdXRfaW50ZXJ2YWwodmlzaWIsIGxlbmd0aCA9IDUsIG5hLnJtID0gVCkpICU+JQogIGdyb3VwX2J5KHByZWNpcCwgdmlzaWJHcm91cCkgJT4lIAogIHN1bW1hcmlzZShtZWFuRGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUKSkgJT4lIAogIGdncGxvdChhZXMocHJlY2lwLCBtZWFuRGVsYXkpKSsKICBnZW9tX3BvaW50KCkgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogICAgZmFjZXRfd3JhcCh+dmlzaWJHcm91cCkgKwogICAgICBsYWJzKAogICAgeCA9ICJQcmVjaXBpdGF0aW9uIChpbiBpbmNoZXMpIiwKICAgIHkgPSAiQXZlcmFnZSBEZXBhcnR1cmUgRGVsYXkgKGluIG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIkFzIHJhaW4gYW5kIGZvZyBpbmNyZWFzZXMsIHNvIGRvIGRlbGF5cyIsCiAgICBzdWJ0aXRsZSA9ICJWaXNpYmlsaXR5IgogICAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCgorKipRdWVzdGlvbiA0OiBEb2VzIHRoZSB2b2x1bWUgb2YgZmxpZ2h0cyBvbiBhbnkgZ2l2ZW4gZGF5IGFmZmVjdCBkZWxheXM/KioKSGFyaSAtIHRoaXMgd2FzIGEgdmVyeSByb3VuZGFib3V0IHdheSBvZiBkb2luZyB0aGlzLiBXb3VsZCBhcHByZWNpYXRlIHRob3VnaHRzIG9uIGEgc2ltcGxlciBzb2x1dGlvbi4KYGBge3J9CiMgQ3JlYXRpbmcgYSB2YXJpYWJsZSBjYWxsZWQgZGVwRGF0ZSBpbiBvcmRlciB0byBjcmVhdGUgYW5vdGhlciB2YXJpYWJsZSBjb250YWluaW5nIG51bWJlciBvZiBmbGlnaHRzIHBlciBkZXBEYXRlIGNhbGxlZCBmbGlnaHRWb2wuIFRoZW4gc3VtbWFyaXNpbmcgdG8gY3JlYXRlIGEgbWVhbiBkZWxheSB2YXIgZ3JvdXBlZCBieSBkZXBEYXRlLiBTYXZpbmcgdGhpcyB0byBhIHRpYmJsZQpkZXBkYXRlbWVhbmRlbCA8LSB3ZWF0aGVyZWRGbGlnaHRzICU+JSAKICBtdXRhdGUoZGVwRGF0ZSA9IHBhc3RlKHllYXIueCwgbW9udGgueCwgZGF5LngsIHNlcCA9ICItIikpICU+JSAKICBncm91cF9ieShkZXBEYXRlKSAlPiUgCiAgbXV0YXRlKGZsaWdodFZvbCA9IG4oKSkgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgIWlzLm5hKGRlcF9kZWxheSkgJiAhaXMubmEoZGVwRGF0ZSkpICU+JSAKICBzdW1tYXJpc2UobWVhbkRlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVCkpCmRlcGRhdGVtZWFuZGVsCgojIENyZWF0aW5nIGFnYWluIGp1c3QgYSB0aWJibGUgbGlrZSBhYm92ZSB3aXRob3V0IHN1bW1hcmlzaW5nIG1lYW4gZGVsYXkuIGNhbGxpbmcgaXQgZmlnaHR2b2x0aWJibGUKZmxpZ2h0dm9sdGliYmxlIDwtIHdlYXRoZXJlZEZsaWdodHMgJT4lIAogIG11dGF0ZShkZXBEYXRlID0gcGFzdGUoeWVhci54LCBtb250aC54LCBkYXkueCwgc2VwID0gIi0iKSkgJT4lIAogIGdyb3VwX2J5KGRlcERhdGUpICU+JSAKICBtdXRhdGUoZmxpZ2h0Vm9sID0gbigpKSAlPiUgCiAgc2VsZWN0KGRlcERhdGUsIGZsaWdodFZvbCkKZmxpZ2h0dm9sdGliYmxlCgojIEZpbmFsbHksIGpvaW5pbmcgdGhlc2UgMiB0aWJibGVzIGFuZCB0aGVuIGV4dHJhY3Rpbmcgb25seSBkaXN0aW5jdCB2YWx1ZXMgZm9yIGVhY2ggZGVwZGF0ZQpuZXdxZm91cnRpYmJsZSA8LSBkZXBkYXRlbWVhbmRlbCAlPiUgCiAgbGVmdF9qb2luKGZsaWdodHZvbHRpYmJsZSwgYnkgPSBjKCJkZXBEYXRlIikpICU+JSAKICBkaXN0aW5jdCgpCiAgbmV3cWZvdXJ0aWJibGUKICAKICMgUGxvdHRpbmcgZmxpZ2h0dm9sIGFnYWluc3QgbWVhbmRlbGF5CiAgbmV3cWZvdXJ0aWJibGUgJT4lIAogICAgZ2dwbG90KGFlcyhmbGlnaHRWb2wsIG1lYW5EZWxheSkpKwogIGdlb21fcG9pbnQoKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgICAjZmFjZXRfd3JhcCh+dmlzaWJHcm91cCkgKwogICAgICBsYWJzKAogICAgeCA9ICJOdW1iZXIgb2YgRmxpZ2h0cyBQZXIgRGF5IiwKICAgIHkgPSAiQXZlcmFnZSBEZXBhcnR1cmUgRGVsYXkgKGluIG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIkRlcGF0dXJlIGRlbGF5cyBhcmUgaGlnaGVyIG9uIGJ1c2llciBkYXlzIgogICAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKc2ltcGxlciB3YXkKYGBge3J9CmZsaWdodHMgJT4lIAogICAgZ3JvdXBfYnkobW9udGgsIGRheSkgJT4lIAogICAgc3VtbWFyaXNlKG5fZmxpZ2h0cyA9IG4oKSwgCiAgICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFQpKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSBuX2ZsaWdodHMsIHkgPSBtZWFuX2RlbGF5KSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCmBgYAoKCipRdWVzdGlvbiA1OiAKCgo=